<?php
class System_Lib_File
{
	/*-------------------------------文件扩展函数-----------------------------------
	
	//作用:模拟 parse_path 但其解决解析带中文文件名路径无法正常获得文件名的问题
	parse_path
	
	//作用:容量单位转换 
	size_unit_convert
	
	//作用:创建目录 可创建路径中包含的所有目录 并将其设置成指定模式
	create_dir
	
	//作用:删除目录 扩展函数 可删除目录中所有文件包括目录
	del_dir
	
	//作用:遍历文件夹
	list_dir
	
	//作用:列出指定文件夹下所有文件
	list_dir_file
	
	//作用:检测指定目录大小
	dir_size
	
	//作用:完整读取文件 替代 file_get_contents 的方案 如果 file_get_contents 函数存在则执行 file_get_contents
	read_file
	
	//作用:将指定内容写入文件
	write_file
	
	//作用:判断目录是否可写
	is_dir_writable
	
	//作用:复制指定指定文件到指定目录及指定名称
	copy_file
	----------------------------------------------------------------------------*/
	
	//作用:模拟 清理路径中多余的斜杠 以及将所有 斜杠转换为 /
	//参数:$path 需要清理的路径字串
	//返回:清理后的路径字串
	public function path_clean($path)
	{
		$path = str_replace('://','__SLASH_SLASH_COLON__',$path);
		$path = str_replace('\\','/',$path);
		$path = preg_replace('/\/\.$/','/',str_replace('/./','/',preg_replace('/\/{2,}/','/',$path)));
		$path = str_replace('__SLASH_SLASH_COLON__','://',$path);
	
		return $path;
	}
	
	//作用:模拟 parse_path 但其解决解析带中文文件名路径无法正常获得文件名的问题
	//参数:$path 需要解析的路径
	//返回:数组 下标分别为 dirname,filename,basename,extension;
	public function parse_path($path)
	{
		$path = str_replace('\\','/',$path);
		$pathinfo = pathinfo($path);
		$pathinfo['filename'] = str_replace('/','',str_replace(($pathinfo['dirname']=='.' ? '' : $pathinfo['dirname']),'',$path));
		$pathinfo['basename'] = $pathinfo['extension'] ? substr($pathinfo['filename'],0,-(int)(strlen('.'.$pathinfo['extension']))) : $pathinfo['filename'];
	
		return $pathinfo;
	}
	
	//作用:容量单位转换 
	//参数:$size 容量及单位 b(默认)|kb|mb|gb|tb
	//参数:$tounit 输出单位 b|kb|mb|gb|tb|auto 当值为 auto(默认) 的时候按照容量自适应生成
	//返回:数值 + 单位
	public function size_unit_convert($size,$tounit='auto')
	{
		preg_match("/([0-9]+)\s*([a-zA-Z]*)/i",$size,$size_array);
		$size = $size_array[1];
		$from_unit = strtolower($size_array[2]);
		$from_unit = $from_unit ? $from_unit : 'b' ;
		$tounit = strtolower($tounit);
	
		$unit['b'] = 1;
		$unit['kb'] = 1024;
		$unit['mb'] = 1048576;
		$unit['gb'] = 1073741824;
		$unit['tb'] = 1099511627776;
		$size_bit = $size * $unit[$from_unit];
	
		if($tounit=='auto')
		{
			if(($convert_size = $size_bit) < 1024)
			{
				return round($convert_size,2).'B';
			}
	
			if(($convert_size = $size_bit/1024) < 1024)
			{
				return round($convert_size,2).'KB';
			}
	
			if(($convert_size = $size_bit/1048576) < 1024)
			{
				return round($convert_size,2).'MB';
			}
	
			if(($convert_size = $size_bit/1073741824) < 1024)
			{
				return round($convert_size,2).'GB';
			}
			
			if(($convert_size = $size_bit/1099511627776) < 1024)
			{
				return round($convert_size).'TB';
			}
		}
		else
		{
			return round($size_bit / $unit[$tounit],2).strtoupper($tounit);
		}
	}
	
	//作用:创建目录 可创建路径中包含的所有目录 并将其设置成指定模式
	//参数:$path 创建目录路径
	//参数:$mode 目录模式(权限)
	//返回:true|false
	public static function create_dir($path,$mode = 0777)
	{
		preg_match_all('/([^\\\|\/]+)[\\\|\/]*/',$path,$array_dir);
		$os = explode(' ', php_uname());
		if(strtolower($os[0])!='windows')
		{
			$array_dir['1']['0'] = '/'.$array_dir['1']['0'];
		}
		$dir = '';
		foreach($array_dir['1'] as $temp_dir)
		{
			$dir.=$temp_dir.'/';
			if(!file_exists($dir))
			{
				@mkdir($dir,$mode);
			}
		}
	
		if(!file_exists($path))
		{
			return false;
		}
	
		return true;
	}
	
	//作用:删除目录 扩展函数 可删除目录中所有文件包括目录
	//参数:$path 要删除的文件/目录
	//参数:$self true(包含指定目录)|false(不包括指定目录只删除指定目录下的)
	//参数:$private_level 私有的内部递归参数用于判断是否到顶层
	//返回:true|false
	public function del_dir($path, $self = false, $private_level = 0)
	{
		$list_dir = $this->list_dir($path);//注此处使用了自定义扩展函数
		
		if(is_array($list_dir))
		{
			foreach($list_dir as $row)
			{
				if($row['type'] == 'dir')
				{
					if(!del_dir($row['path'],'1', $private_level+1))
					{
						return false;
					}
				}
				else
				{
					@unlink($row['path']);
				}
			}
		}
		else
		{
			@unlink($path);
		}
	
		if($private_level!=0 || $self)
		{
			if(is_dir($path))
			{
				@chmod($path, 0777);
				if(!rmdir($path))
				{
					return false;
				}
			}
		}
		return true;
	}
	
	
	//作用:遍历文件夹
	//参数:$path 要遍历的文件夹
	//参数:$type 传回文件数组的类型 all|dir|file
	//返回:返回文件夹内容数组 | false 文件夹不存在
	public function list_dir($path,$type = 'all')
	{
		if(!$dir = @dir($path))
		{
			return false;
		}
		$i = 0;
		while (false !== ($filename = $dir->read())) 
		{
			if (eregi("^\.{1,2}$",$filename)) {	continue; }
	
			$fileinfo = stat($dir->path.'/'.$filename);
			$pathinfo = pathinfo($filename);
			$filetype = filetype($dir->path.'/'.$filename);
	
			if(($type == 'file' && $filetype == 'dir') && $type != 'all'){	continue;	}			
			if(($type == 'dir' && $filetype == 'file') && $type != 'all'){	continue;	}
			
			$list[$i]['type'] = $filetype;
			$list[$i]['filename'] = $filename;
			$list[$i]['basename'] = basename($pathinfo['basename'],'.'.(empty($pathinfo['extension'])?'':$pathinfo['extension']));
			$list[$i]['extension'] = (empty($pathinfo['extension'])?'':$pathinfo['extension']);
			$list[$i]['time'] = $fileinfo['mtime'];
			$list[$i]['size'] = $fileinfo['size'];
			$list[$i]['dir'] = path_clean($dir->path);
			$list[$i]['path'] = path_clean($dir->path.'/'.$filename);
	
			$i++;
		}
		$dir->close();
		@array_multisort($list,SORT_ASC,$list);//排序 如果搜索全部类型则先列数组
		return $list;
	}
	
	
	//作用:列出指定文件夹下所有文件
	//参数:$path 要遍历的文件夹
	//返回:返回文件夹内容数组 | false 文件夹不存在
	public function list_dir_file($path,$i = 0)
	{
		if(!$dir = @dir($path))
		{
			return false;
		}
		
		$list_array = $this->list_dir($path);
	
		$list_array = is_array($list_array) ? $list_array : array() ;
	
		foreach ($list_array as $value)
		{
			if($value['type'] == 'dir')
			{
				list_dir_file($value['path'],$i+1);
			}
			else
			{
				$GLOBALS['LIST_ALL_FILE_INSIDE_ARRAY'][] = $value;
			}
		}
	
		if($i == 0)
		{
			$return_array = $GLOBALS['LIST_ALL_FILE_INSIDE_ARRAY'];
			unset($GLOBALS['LIST_ALL_FILE_INSIDE_ARRAY']);
		}
	
		return $return_array;
	}
	
	//作用:检测指定目录大小
	//参数:$path 要检测的目录
	//返回:返回文件夹所占用的空间的字节数
	public function dir_size($path)
	{
		static $dir_size;
		$list_dir = $this->list_dir($path);
	
		if(is_array($list_dir))
		{
			foreach($list_dir as $row)
			{
				if($row['type']=='dir')
				{
					dir_size($row['path']);
				}
				else
				{
					$dir_size += filesize($row['path']);
				}
			}
		}
	
		return $dir_size;
	}
	
	
	//作用:完整读取文件 替代 file_get_contents 的方案 如果 file_get_contents 函数存在则执行 file_get_contents
	//参数:$path 要读取的文件路径
	//返回:返回读取的文件内容
	public function read_file($path)
	{
		if(empty($content)) $content = '';
		
		if (!($file = @fopen($path,'rb')))
		{
			return false;
		}
	
		@flock($file, LOCK_SH);
		while($line=fread($file,5048))
		{
			$content .= $line;
		}
	
		@flock($file, LOCK_UN);
		fclose($file);
	
		return $content;
	}
	
	//作用:将指定内容写入文件
	//参数:$content 要写入的内容
	//参数:$path 文件存放路径
	//参数:$mode 写入模式 默认 wb
	//返回:true|false 是否写入成功
	public function write_file($content,$path,$mode='wb')
	{
		if(!is_dir(dirname($path)))
		{
			@$this->create_dir(dirname($path));
		}
	
		if(!($file = fopen($path,$mode)))
		{
			return false;
		}
	
		@flock($file, LOCK_EX + LOCK_NB);
		fwrite($file, $content);
		@flock($file, LOCK_UN);
		fclose($file);
	
		return true;
	}
	
	//作用:判断目录是否可写
	//参数:$dir 要检测的目录
	//返回:true|false 是否写入成功
	public function is_dir_writable($dir) 
	{
		if(!is_dir($dir)) 
		{
			create_dir($dir);
		}
	
		if(is_dir($dir))
		{
			if(write_file('test',$dir.'/test.test')) 
			{
				del_dir($dir.'/test.test');
				$writable = true;
			}
			else 
			{
				del_dir($dir.'/test.test');
				$writable = false;
			}
		}
	
		return $writable;
	}
	
	//作用:复制指定指定文件到指定目录及指定名称
	//参数:$path 文件来源路径 可以为URL
	//参数:$dir 文件存放目录 可选参数
	//参数:$filename 新文件名称 可选参数 当此选项为空时默认与来源文件名相同
	public function copy_file($path,$dir = false,$filename = false)
	{
		$file = parse_path($path);
	
		if(!($content = read_file($path)))
		{
			return false;
		}
	
		return write_file($content,( $dir ? $dir.'/' : '').($filename ? $filename : $file['filename']));
	}
	
	//读取图片转成字符串
	public function readPicToStr($read_path)
	{
		$str = '';
		$fp = fopen($read_path, 'r');
		while($tmpStr=fread($fp, 1024))
		$str .= $tmpStr;
		fclose($fp);
		
		return $str;
	}
	
	//图片字符串保存成图片文件
	public function saveStrToPic($pic_str, $save_path)
	{
		$fp = fopen($save_path, 'w');
		fwrite($fp, $pic_str);
		fclose($fp);
		
		return $save_path;
	}
	
	//获取用户IP地址
	public function getLoginIP() 
	{
		  
	}
	
	public function api_input($data) 
	{
		$s = urlencode(authcode($data.'&agent='.md5($_SERVER['HTTP_USER_AGENT'])."&time=".time(), 'ENCODE', '123456789'));
		return $s;
	}

    /**
     * 获得文件的扩展名
     */
    public static function getExtension($file) 
    { 
        $info = pathinfo($file); 
        return $info['extension']; 
    }
}
?>